package com.lsx143.realtime.util;

import com.alibaba.fastjson.JSONObject;
import com.lsx143.realtime.common.Constants;
import lombok.NonNull;
import redis.clients.jedis.Jedis;

import java.sql.Connection;
import java.util.List;

/**
 * Dim维度层的工具类
 */
public class DimUtil {
    /**
     * 指定订单id在维度表中,查询出该订单的其他维度信息,组成宽表
     *
     * @param phoenixCon Phoenix的JDBC连接对象
     * @param table      需要添加的维度所在的维度表名
     * @param id         需要查找的订单id
     * @return JSONObject形式的宽表数据
     */
    public static JSONObject readDimFromPhoenix(Connection phoenixCon, String table, @NonNull Long id) {
        String sql = "select * from " + table + " where id=?";
        List<JSONObject> queryList = JdbcUtil.queryList(
                phoenixCon,
                sql,
                new Object[]{id.toString()},
                JSONObject.class);
        return queryList.size() == 0 ? new JSONObject() : queryList.get(0);
    }

    /**
     * 从Redis缓存中获取DIM维度数据
     *
     * @param jedis redis连接
     * @param table dim维度表表名
     * @param id    查询的id
     * @return order订单的Json数据
     */
    public static JSONObject readDimFromRedis(Jedis jedis, String table, @NonNull Long id) {
        //拼接key
        String key = table + ":" + id;
        //从redis中获取结果
        String result = jedis.get(key);
        if (result != null && result.length() == 0) {

            throw new RuntimeException("空");
        }
        return result == null ? null : JSONObject.parseObject(result);
    }

    /**
     * 从redis和hbase中获取宽表数据
     *
     * @param phoenixCon Phoenix的连接
     * @param jedis      redis的连接
     * @param table      维度表名
     * @param id         待查询的id值
     * @return 维度宽表json
     */
    public static JSONObject readDim(Connection phoenixCon, Jedis jedis, String table, @NonNull Long id) {

        JSONObject dimData = readDimFromRedis(jedis, table, id);
        //先从redis缓存中获取订单宽表数据
        if (dimData == null) {
            System.out.println("从Hbase中获取数据:" + table + ":" + id);
            //1.从hbase中读取数据
            dimData = readDimFromPhoenix(phoenixCon, table, id);
            //2.更新数据到redis中
            writeToRedis(jedis, table, id, dimData);
        } else {
            System.out.println("从Redis缓存中获取数据:" + table + ":" + id);
        }
        return dimData;
    }

    /**
     * 写入数据到redis中
     *
     * @param jedis   redis连接对象
     * @param table   维度表名
     * @param id      数据的id
     * @param dimData 写入redis的维度数据
     */
    private static void writeToRedis(Jedis jedis, String table, Long id, JSONObject dimData) {
        //拼接key
        String key = table + ":" + id;
        String value = dimData.toJSONString();
        //更新数据并设置过期时间
        jedis.setex(key, Constants.REDIS_EXPIRE_TIME, value);
    }
}
